import os
import subprocess
from pylint.lint import Run as pylint_run  # 使用 pylint 的 Python API
from radon.complexity import cc_visit
from radon.metrics import mi_visit

def check_pep8(file_path):
    """
    使用 flake8 检查代码是否符合 PEP 8 规范。
    """
    print(f"检查 PEP 8 规范: {file_path}")
    result = subprocess.run(["flake8", file_path], capture_output=True, text=True)
    if result.returncode != 0:
        print(result.stdout)
    else:
        print("PEP 8 检查通过，未发现问题。")

def check_pylint(file_path):
    """
    使用 pylint 进行静态代码分析。
    """
    print(f"使用 pylint 进行静态代码分析: {file_path}")
    # 使用 pylint 的 Python API
    results = pylint_run([file_path], exit=False)
    if results.linter.stats['by_msg']:  # 如果有错误或警告
        for msg_id, count in results.linter.stats['by_msg'].items():
            print(f"发现 {count} 个 {msg_id} 问题。")
    else:
        print("pylint 检查通过，未发现问题。")

def check_code_complexity(file_path):
    """
    使用 radon 检查代码复杂度。
    """
    print(f"检查代码复杂度: {file_path}")
    with open(file_path, "r") as f:
        code = f.read()
    # 计算圈复杂度
    complexity = cc_visit(code)
    for block in complexity:
        print(f"函数/方法 '{block.name}' 的圈复杂度为 {block.complexity}")
    # 计算可维护性指数
    maintainability_index = mi_visit(code)
    print(f"文件的可维护性指数为: {maintainability_index}")

def check_unused_imports(file_path):
    """
    检查未使用的导入。
    """
    print(f"检查未使用的导入: {file_path}")
    result = subprocess.run(["pylint", "--disable=all", "--enable=unused-import", file_path], capture_output=True, text=True)
    if result.returncode != 0:
        print(result.stdout)
    else:
        print("未发现未使用的导入。")

def code_review(directory):
    """
    对指定目录下的所有 Python 文件进行代码审查。
    """
    for root, _, files in os.walk(directory):
        for file in files:
            if file.endswith(".py"):
                file_path = os.path.join(root, file)
                print(f"\n正在审查文件: {file_path}")
                check_pep8(file_path)
                check_pylint(file_path)
                check_code_complexity(file_path)
                check_unused_imports(file_path)
                print("-" * 80)

if __name__ == "__main__":
    # 指定要审查的目录
    target_directory = "D:\code\git-change-analyzer-app"
    code_review(target_directory)